import axios from 'axios'
import qs from 'qs'
import ex from '@/config/my-config.js'
import {getRefreshToken, getToken, getTokenType, isNotBlank, removeToken, setToken} from '@/libs/util'
import {Message} from "view-ui-plus";
// import useUser from '@/store/user'
// const user=useUser()
// 创建axios实例
export function _axios(config) {
    const service = axios.create({
        // axios中请求配置有baseURL选项，表示请求URL公共部分
        baseURL: ex.setting._baseUrl,
        // 超时
        timeout: ex.requestTimeout,
        method: 'post'
    })
    // request拦截器
    service.interceptors.request.use(config => {
        const token = getToken()
        const token_type = getTokenType()
        if (isNotBlank(token)) {
            // 让每个请求携带token-- ['Authorization']
            config.headers.Authorization = token_type + ' ' + token
            // 处理刷新token后重新请求的自定义变量
            config['refresh_token'] = false
        }
        if (config.dataType == 'formData') {
            config.headers['content-type'] = 'application/x-www-form-urlencoded'
            config.data = qs.stringify(config.data)
        }
        return config
    }, error => {
        console.log(error)
        Promise.reject(error)
    })

    // 响应拦截器
    service.interceptors.response.use(res => {
            const {data, status, config} = res
            // 如果存在新的token，则更新token
            const newToken = res.headers['new-access-token'];
            if (newToken) {
                setToken(newToken)
            }
            // 默认的错误处理
            if(data.success===false && !config?.skipDefaultErrorHandling){
                Message.error({
                    content:data.msg
                })
            }
            // 默认的成功处理
            if (data.success &&  !config?.skipDefaultMsg) {
                if (data.data?.msg) {
                    Message.success({
                        content: data.data.msg
                    })
                }
            }

            return data
        },
        error => {
            const showDefaultErrorHandling=!error.config?.skipDefaultErrorHandling
            try {
                if(!error.response){
                    showDefaultErrorHandling && Message.error({
                        content:'请求失败，无响应：'+error.message
                    })
                    return Promise.reject(error)

                }
                if (error.response.status === 401 ) {
                    if(error.config.url !== 'auth/refreshToken'){
                        // 处理token过期，先判断是否满足刷新token的条件
                        return refreshTokenAndRetry(error.config);
                    }else {
                        removeToken()
                        window.location.href = '/login';
                        showDefaultErrorHandling && Message.error({
                            content:'请求已过期，请重新登录'
                        })
                        // 3. 终止后续请求队列（若存在）
                        return Promise.reject(error);
                    }

                }
                else if (error.response.status === 404) {
                    // 接口不存在，直接跳转或提示
                    // alert('请求的接口不存在');
                    showDefaultErrorHandling && Message.error({
                        content:'请求的接口不存在'
                    })
                    // removeToken();
                    // window.location.href = '/login';
                }else if (error.response.status === 500){
                    showDefaultErrorHandling && Message.error({
                        content: error.response.data.message || '接口内部错误'
                    })
                    showDefaultErrorHandling && console.error('堆栈信息：', error.response.data.stack)
                }
                return Promise.reject(error)
            }catch (err){
                removeToken()
                window.location.href = '/login';
            }

        }
    )

    async function refreshTokenAndRetry(originalRequest) {
        // 根据refreshToken重新补发token
        const {data: data} = await service({
            url: 'auth/refreshToken',
            method: 'post',
            data: {
                refreshTokenId: getRefreshToken()
            }
        });
        setToken(data.accessToken, data.refreshTokenId)

        originalRequest.headers.Authorization = `Bearer ${data.access_token}`;
        return service(originalRequest);
    }

    return service(config)
}
